package com.skq.anno;

import com.skq.validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.*;

/**
 * @author skq
 * @data 2024/6/11
 */

/**
 * 定义了一个约束注解，用于验证对象的状态是否满足特定条件。
 * 此注解适用于字段级别，并且可以在运行时通过反射机制来检查和验证。
 *
 * @Documented 标记此注解将被包含在文档中。
 * @Constraint 注解表明这是一个约束注解，验证逻辑由StateValidation类实现。
 * @validatedBy 指定验证此注解的实现类为StateValidation。
 * @Target 指定此注解可以应用于字段（FIELD）。
 * @Retention 指定此注解在运行时（RUNTIME）仍然有效。
 */
@Documented
@Constraint(
        validatedBy = {StateValidation.class}
)
@Target({ElementType.FIELD,})
@Retention(RetentionPolicy.RUNTIME)

/**
 * 定义一个名为State的注解，用于标注状态验证的约束条件。
 * 此注解可以用于确保某个状态参数的值符合预期的发布或草稿状态。
 */
public @interface State {
    /**
     * 指定当状态参数不符合预期值时，返回的错误信息。
     * 默认值为"state参数的值只能是已发布或草稿"。
     * 这允许在不修改注解的情况下提供自定义的错误消息。
     */
    String message() default "state参数的值只能是已发布或草稿";

    /**
     * 定义了该注解应用于哪些验证组。
     * 验证组允许对不同的验证条件进行分组，默认情况下，该注解属于空组。
     * 这个特性允许在不同的场景下应用不同的验证条件。
     */
    Class<?>[] groups() default {};

    /**
     * 定义了与该注解相关的负载类型。
     * 负载类型可以用于携带额外的验证信息，默认情况下为空。
     * 这个特性为高级验证场景提供了灵活性，允许传递额外的上下文信息。
     */
    Class<? extends Payload>[] payload() default {};
}

